﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Generic.Contract;
using Generic.Data.Manager;
using Contract.Business.Entity;
using Contract.Business.Filter;
using DataEntity;

namespace Contract.Data.Manager
{
    //Criado por : Gustavo
    //Data       : 12/23/2011 6:33:54 PM
    public class DMPromocao : DMGeneric<BEPromocao, FEPromocao>
    {
        databaseDataContext dc;

        #region Override

        public override BEPromocao Salvar(BEPromocao entidade)
        {
            try
            {
                if (entidade.Codigo.Equals(0))
                    entidade.Codigo = Incluir(entidade);
                else
                    Alterar(entidade);

                return entidade;
            }
            catch (Exception)
            {
                throw;
            }
        }

        public override void Excluir(BEPromocao entidade)
        {
            try
            {
                using (dc = new databaseDataContext())
                {

                    var q = from r in dc.DEPromocaos
                            where
                                r.Codigo == entidade.Codigo
                            select r;

                    DEPromocao de = q.First();

                    dc.DEPromocaos.DeleteOnSubmit(de);

                    dc.SubmitChanges();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        public override BEPromocao ObterEntidade(int codigo)
        {
            try
            {
                using (dc = new databaseDataContext())
                {

                    var q = from e in dc.DEPromocaos
                            where
                                e.Codigo == codigo
                            select e;

                    return q.First().ConvertToBE(1);
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        public override List<BEPromocao> ObterTodos(FEPromocao filter)
        {
            try
            {
                using (dc = new databaseDataContext())
                {

                    var q = from e in dc.DEPromocaos
                            where
                            (
                                (((filter.Nome != null)
                                && (e.Nome.Contains(filter.Nome))) || (filter.Nome == null)) &&

                                (((filter.DataInicio != null)
                                && (e.DataInicio == filter.DataInicio)) || (filter.DataInicio == null)) &&

                                (((filter.DataFim != null)
                                && (e.DataFim == filter.DataFim)) || (filter.DataFim == null)) &&

                                (((filter.ParaSempre != null)
                                && (e.ParaSempre == filter.ParaSempre)) || (filter.ParaSempre == null)) &&

                                (((filter.DiasSemana != null)
                                && (e.DiasSemana.Contains(filter.DiasSemana))) || (filter.DiasSemana == null)) &&

                                (((filter.CodigoProdutoGratis != null)
                                && (e.CodigoProdutoGratis == filter.CodigoProdutoGratis)) || (filter.CodigoProdutoGratis == null)) &&

                                (((filter.CodigoProdutoPromocao != null)
                                && (e.CodigoProdutoPromocao == filter.CodigoProdutoPromocao)) || (filter.CodigoProdutoPromocao == null)) &&

                                (((filter.Ativo != null)
                                && (e.Ativo == filter.Ativo)) || (filter.Ativo == null))
                            )
                            select e;

                    List<DEPromocao> dePromocao = q.ToList();

                    List<BEPromocao> retorno = new List<BEPromocao>();

                    foreach (DEPromocao de in dePromocao)
                        retorno.Add(de.ConvertToBE(1));

                    return retorno;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        #endregion

        #region Métodos Auxiliares

        private int Incluir(BEPromocao entidade)
        {
            try
            {
                using (dc = new databaseDataContext())
                {
                    DEPromocao de = new DEPromocao();
                    de.ConvertFromBE(entidade);

                    dc.DEPromocaos.InsertOnSubmit(de);

                    dc.SubmitChanges();

                    return de.Codigo;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        private void Alterar(BEPromocao entidade)
        {
            try
            {
                using (dc = new databaseDataContext())
                {

                    var q = from e in dc.DEPromocaos
                            where e.Codigo == entidade.Codigo
                            select e;

                    DEPromocao de = q.First();

                    de.Nome = entidade.Nome;
                    de.DataInicio = entidade.DataInicio;
                    de.DataFim = entidade.DataFim;
                    de.ParaSempre = entidade.ParaSempre;
                    de.DiasSemana = entidade.DiasSemana;
                    de.Desconto = entidade.Desconto;
                    de.CodigoProdutoGratis = entidade.CodigoProdutoGratis;
                    de.CodigoProdutoPromocao = entidade.CodigoProdutoPromocao;
                    de.DescontoPromocao = entidade.DescontoPromocao;
                    de.Ativo = entidade.Ativo;

                    dc.SubmitChanges();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        #endregion
    }
}
